<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // 高阶函数，要吗把函数作为参数，要吗把函数作为结果返回
    // 函数作为参数和返回的结果，本质上没有不同

    // function add(a, b) {
    //     return a + b;
    // }

    // var aa = add(1, 2);

    // console.log(aa);

    // function adc(a) {
    //     return function (y) {
    //         return a + b;
    //     }
    // }
    // var c = add(10);



    // 数组的常用高阶函数有：map(), forEach(),filter(), find(), sort(),every(),some(),reduce()







    // forEach()和for 都可以用来循环数组，forEach的性能比for循环低
    // 但是forEach循环使用方式和使用场景比for循环更简洁和更多，所以优先使用forEach
    // forEach方法不会修改原数组，forEach方法的回调函数接受三个参数，第一个是当前元素，第二个是当前索引，第三个是原始数组
    // 当前元素和当前索引也可以通过原数组名加上方括号的方式获取

    // var arr = ['周杰伦', '陈冠希', '黄宗泽', '尊龙', '道枝骏佑'];
    // // currentValue循环的当前元素值
    // // index循环的当前索引值
    // // array当前数组对象
    // arr.forEach(function (currentValue, index, array) {
    //     console.log(currentValue, index, array);
    // })


    // var arr1 = [{ name: '周杰伦' }, { name: '陈冠希' }, { name: '黄宗泽' }, { name: '尊龙' }, { name: '道枝骏佑' }];
    // arr1.forEach(function (currentValue, index, array) {
    //     console.log(currentValue.name = '你好' + currentValue.name + '我喜欢你！！！');
    // })

    // var arr2 = [{ name: '周杰伦' }, { name: '陈冠希' }, { name: '黄宗泽' }, { name: '尊龙' }, { name: '道枝骏佑' }];
    // arr2.forEach(function (currentValue, index, array) {
    //     currentValue.name = '0000' + currentValue.name
    // }, arr2)
    // console.log(arr2);












    // map()
    // 会返回一个新数组，这个新的数组会按照原始数组的顺序排列
    // 它的参数是一个函数
    // 这个函数参数有三个值，当前元素，当前索引和原数组
    // 函数的返回值作为新数组的元素
    // map()不会修改原数组
    // var arr4 = [{ name: '周杰伦', age: 38 }, { name: '陈冠希', age: 38 }, { name: '黄宗泽', age: 58 }, { name: '尊龙', age: 78 }, { name: '道枝骏佑', age: 18 }];
    // var mapArr = arr4.map(function (currentValue, index, array) {
    //     currentValue.name = '你好' + currentValue.name + '我喜欢你！！！';
    //     return currentValue;
    //     // currentValue.age = currentValue.age + 10;
    //     // return currentValue.age < 60;

    // }, arr4)
    // console.log(mapArr);






    // filter()
    // 过滤/筛选。把数组中符合指定条件的数据保留，不符合条件的数据过滤掉，返回一个符合要求的新数组
    // 会返回一个新数组，这个新的数组中元素是原始数组中的元素的一个子集
    // 它的参数是一个函数
    // 这个函数参数有三个值，当前元素，当前索引和原数组
    // 如果当前元素的条件满足，函数返回true，这个元素会被添加到新数组中
    // filter()不会修改原数组
    // var arr5 = [{ name: '周杰伦', age: 38 }, { name: '陈冠希', age: 38 }, { name: '黄宗泽', age: 58 }, { name: '尊龙', age: 78 }, { name: '道枝骏佑', age: 18 }];
    // var filterArr = arr5.filter(function (currentValue, index, array) {
    //     currentValue.age = currentValue.age + 10;
    //     return currentValue.age < 60;

    // }, arr5)
    // console.log(filterArr);







    // every()
    // 用于检查数组中的所有元素是否满足某个条件，当所有元素都满足条件时，返回true，否则返回false
    // 参数是一个回调函数，回调函数的参数是一个函数，函数参数有三个值，当前元素，当前索引和原数组
    // 返回值：数组中是否所有元素都满足条件
    // every()不会修改原数组

    // var arr6 = [{ name: '周杰伦', age: 38 }, { name: '陈冠希', age: 38 }, { name: '黄宗泽', age: 58 }, { name: '尊龙', age: 78 }, { name: '道枝骏佑', age: 18 }];
    // var everyArr = arr6.every(function (currentValue, index, array) {
    //     currentValue.age = currentValue.age + 10;
    //     return currentValue.age < 60;

    // }, arr6)
    // console.log(everyArr);





    // some()
    // 用于检查数组中的某些元素是否满足某个条件，只要有一个满足条件则返回true，否则返回false
    // 参数是一个回调函数，回调函数的参数是一个函数，函数参数有三个值，当前元素，当前索引和原数组
    // 返回值：数组中是否存在满足条件的元素
    // some()不会修改原数组

    // var arr7 = [{ name: '周杰伦', age: 38 }, { name: '陈冠希', age: 38 }, { name: '黄宗泽', age: 58 }, { name: '尊龙', age: 78 }, { name: '道枝骏佑', age: 18 }];
    // var someArr = arr7.some(function (currentValue, index, array) {
    //     currentValue.age = currentValue.age + 10;
    //     return currentValue.age < 60;

    // }, arr7)
    // console.log(someArr);





    // find()




    // findIndex()





    // reduce()





    // 手写forEach()
    // arr.forEach(function (currentValue, index, array) {
    //     currentValue.age = currentValue.age + 10;
    //     console.log(currentValue.age);
    // })



    // var arr = [{ name: '周杰伦', age: 28 }, { name: '陈冠希', age: 38 }, { name: '黄宗泽', age: 58 }, { name: '尊龙', age: 78 }, { name: '道枝骏佑', age: 18 }]
    // Array.prototype.myForeach = function (fn) {
    //     for (var i = 0; i < this.length; i++) {
    //         fn(this[i], i, this);
    //     }
    // }
    // arr.myForeach(function (Value, index, array) {
    //     Value.age = Value.age + 10;
    //     console.log(Value.age);

    // })




    // 手写map()
    // var arr = [{ name: '周杰伦', age: 28 }, { name: '陈冠希', age: 38 }, { name: '黄宗泽', age: 58 }, { name: '尊龙', age: 78 }, { name: '道枝骏佑', age: 18 }]
    // Array.prototype.MyMap = function (fn) {
    //     var newArray = [];
    //     for (var i = 0; i < this.length; i++) {
    //         fn(this[i], i, this);
    //         newArray.push(this[i]);
    //     }

    //     return newArray
    // }
    // var a = arr.MyMap(function (Value, index, array) {
    //     Value.age = Value.age + 10;

    // })
    // console.log(a);



    // 手写filter()
    var arr = [1, 2, 3, 4]
    Array.prototype.MyFilter = function (fn) {
        var newArray = [];
        for (var i = 0; i < this.length; i++) {
            var item = fn(this[i], i, this);
            if (item) {
                newArray.push(this[i]);
            }

        }

        return newArray
    }
    var a = arr.MyFilter(function (item, index, array) {
        return item > 2

    })
    console.log(a);
    






</script>

</html>